package org.lql.chaos.rocketmq.service.producer;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.annotation.RocketMQTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionListener;
import org.apache.rocketmq.spring.core.RocketMQLocalTransactionState;
import org.springframework.messaging.Message;

/**
 * @author: liangqinglong
 * @date: 2025-08-16 20:19
 * @description: 事务消息监听器实现
 **/
@Slf4j
@RocketMQTransactionListener
public class TransactionListenerImpl implements RocketMQLocalTransactionListener {

    /**
     * 执行本地事务
     *
     * @param msg 消息
     * @param arg 事务参数
     * @return 事务状态
     */
    @Override
    public RocketMQLocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        log.info("执行本地事务，消息：{}，参数：{}", msg, arg);
        try {
            // 在这里执行本地事务逻辑，比如更新数据库等操作
            // 模拟本地事务执行
            String payload = new String((byte[]) msg.getPayload());
            log.info("执行本地事务逻辑，消息内容：{}", payload);
            
            // 模拟业务处理结果
            // 根据业务逻辑返回不同的事务状态
            if (payload.contains("success")) {
                // 本地事务执行成功
                return RocketMQLocalTransactionState.COMMIT;
            } else if (payload.contains("rollback")) {
                // 本地事务执行失败，需要回滚
                return RocketMQLocalTransactionState.ROLLBACK;
            } else {
                // 本地事务执行中，需要MQ回调检查
                return RocketMQLocalTransactionState.UNKNOWN;
            }
        } catch (Exception e) {
            log.error("执行本地事务异常：", e);
            return RocketMQLocalTransactionState.ROLLBACK;
        }
    }

    /**
     * 检查本地事务状态
     *
     * @param msg 消息
     * @return 事务状态
     */
    @Override
    public RocketMQLocalTransactionState checkLocalTransaction(Message msg) {
        log.info("检查本地事务状态，消息：{}", msg);
        // 根据消息内容或业务数据检查本地事务状态
        String payload = new String((byte[]) msg.getPayload());
        log.info("检查本地事务状态，消息内容：{}", payload);
        
        // 模拟检查结果
        if (payload.contains("事务消息")) {
            return RocketMQLocalTransactionState.COMMIT;
        } else if (payload.contains("rollback")) {
            return RocketMQLocalTransactionState.ROLLBACK;
        }
        
        // 继续保持UNKNOWN状态
        return RocketMQLocalTransactionState.UNKNOWN;
    }
}